// #include <stdio.h>
// #include <pthread.h>
// #include <semaphore.h>

// sem_t sem;

// void* thread_func(void* arg) {
//     sem_wait(&sem); // 进入临界区前等待信号量
//     printf("Thread %ld is working\n", (long)arg);
//     sem_post(&sem); // 离开临界区后释放信号量
//     return NULL;
// }

// int main() {
//     pthread_t t1, t2;

//     // 初始化信号量，线程间共享，初始计数为1（相当于互斥锁）
//     sem_init(&sem, 0, 1); 

//     pthread_create(&t1, NULL, thread_func, (void*)1);
//     pthread_create(&t2, NULL, thread_func, (void*)2);

//     pthread_join(t1, NULL);
//     pthread_join(t2, NULL);

//     sem_destroy(&sem); // 使用完后销毁信号量
//     return 0;
// }


#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

sem_t sem;

void* thread_func(void* arg) {
    sem_wait(&sem); // 等待信号量

    // 临界区代码
    printf("线程 %ld 进入临界区\n", (long)arg);
    
    // 模拟工作
    sleep(1);
    
    printf("线程 %ld 离开临界区\n", (long)arg);

    sem_post(&sem); // 释放信号量
    return NULL;
}

int main() {
    pthread_t t1, t2;

    // 初始化信号量，初始值为1，类似互斥锁
    sem_init(&sem, 0, 1);

    pthread_create(&t1, NULL, thread_func, (void*)1);
    pthread_create(&t2, NULL, thread_func, (void*)2);

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    sem_destroy(&sem);
    return 0;
}
